package com.joezhou.spring.proxy;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK代理公司负责返回代理对象
 *
 * @author JoeZhou
 */
@Slf4j
public class JdkProxyCompany implements InvocationHandler {

    private Object customer;

    /**
     * 代理工作清单
     *
     * @param proxy  代理对象
     * @param method 代理方法的Method对象
     * @param args   代理方法的形参
     * @return 代理方法的返回值，若是void，就返回null
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws InvocationTargetException, IllegalAccessException {

        log.info("鉴权...");

        // 反射方法：返回值 = 方法对象.invoke(客户对象, 方法形参)
        Object methodReturn = method.invoke(customer, args);

        log.info("日志...");

        return methodReturn;
    }

    /***
     * 聘用一个代理，聘用代理时必须告诉我客户是谁
     *
     * @param customer 客户实体
     * @return 代理对象
     */
    public Object hireProxy(Object customer) {
        this.customer = customer;

        // 创建代理时，需要获取客户的类加载器，客户的所有接口和任务清单所在类
        return Proxy.newProxyInstance(
                customer.getClass().getClassLoader(),
                customer.getClass().getInterfaces(), this);
    }
}